/******************************************************
Cours: LOG121
Session: A2012
Groupe: 01
Projet: Laboratoire #1
Ã‰tudiant(e)s: Guillaume Boulay
               Pierre-Olivier DubÃ©
               SÃ©bastien Gergel
Professeur et chargé de labo : Patrice Boucher
Nom du fichier: MainFrame.java
Date crÃ©e: 2012-10-16
Date dern. modif. 2012-10-31
*******************************************************
Historique des modifications
*******************************************************
2012-10-16 Version initiale (Pierre-Olivier Dubé)
2012-10-31 Ajout de constantes (Guillaume Boulay)
*******************************************************/

package manager;

import java.awt.*;
import java.io.*;
import java.util.*;

import javax.swing.ButtonGroup;
import javax.swing.JOptionPane;

import formes.*;
import server.*;
import utils.Constant;
import utils.LinkedList;
import utils.Sorting;

/**
 * Permet de gérer l'affichage des formes
 * <br \>
 * Cette classe est utilisée par la classe MainFrame. En fait, DisplayManager 
 * est un aire de dessin sur lequel des formes sont déssinées.
 * 
 * @author Pierre-Olivier Dubé
 */
@SuppressWarnings("serial")
public class DisplayManager extends Canvas 
{
	private LinkedList linkedShapes;
	// Liste des formes
	private ArrayList<Forme> shapes;
	// La forme la plus récente obtenue par le serveur
    private Forme shape;
	// La forme la plus récente obtenue par le serveur
    private String[] shapesArray;
    
	LinkedList actualShape;
	LinkedList firstShape;
    
    /**
     * Constructeur par défaut de DisplayManager. 
     * 
     * Configure la taille du canvas à 500x500
     * Créée la liste de formes vide
     */
	public DisplayManager()
	{
		this.setSize(Constant.WIDTH, Constant.HEIGHT);
		shapes = new ArrayList<Forme>();
	}
	
	/**
	 * Fonction permettant de générer une forme sur le canvas.
	 * 
	 * Premièrement, on s'assure qu'il y ait seulement 10 formes d'affichÃ©es 
	 * sur le canvas.
	 * Ensuite, la forme est créée, ajoutée à la liste et dessinÃ©e sur le canvas
	 * ?
	 * @throws IOException
	 */
	public void generateShape() throws IOException 
	{
		if (shapes.size() >= Constant.FORM_NB)
			shapes.remove(0);
		
		if ((shape = FormeCreator.createForme(RequestManager.getForm())) == null)
			JOptionPane.showMessageDialog(null, "Une erreur a empèché la forme d'ètre générée.");
		else
		{
		    this.getGraphics().clearRect(0, 0, Constant.WIDTH, Constant.HEIGHT);
			shapes.add(shape);
			
			for (int i = 0; i < shapes.size(); i++) {
		         shapes.get(i).draw(this.getGraphics());
			}
		}
	}
	
	/**
	 * Fonction permettant de générer des forme sur le canvas.
	 * 
	 * Premi<erement, on s'assure qu'il y ait seulement 10 formes d'affichÃ©es 
	 * sur le canvas.
	 * Ensuite, la forme est créée, ajoutée à la liste et dessinée sur le canvas
	 * 
	 * @throws IOException
	 */
	public void generateShapes(String orderButtonText) throws IOException 
	{		
		int distance = 0;
		
		actualShape = linkedShapes;
		firstShape = null;
		
		shapesArray = RequestManager.getForms(Constant.FORM_NB);
		
		for (int i = 0; i < Constant.FORM_NB; ++i)
		{
			if ((shape = FormeCreator.createForme(shapesArray[i])) == null)
				JOptionPane.showMessageDialog(null, "Une erreur a empèché la forme d'ètre générée.");
			else if (i == 0)
			{
				actualShape = new LinkedList(shape);
				firstShape = actualShape;
			}
			else
			{
				actualShape.add(new LinkedList(shape));
				actualShape = actualShape.next();		
			}
		}

		actualShape = firstShape;		
		
		//apelle une des methode de sort, chosit laquelle est fait un if-else
		    	
    	if (orderButtonText == Constant.ORDRE_ID_CROISSANT)
    		actualShape = Sorting.sortIdCroissant(actualShape);    		
		else if (orderButtonText == Constant.ORDRE_ID_DECROISSANT)
    		actualShape = Sorting.sortIdDeroissant(actualShape);  
		else if (orderButtonText == Constant.ORDRE_AIRE_CROISSANT)
    		actualShape = Sorting.sortAireCroissant(actualShape);  
		else if (orderButtonText == Constant.ORDRE_AIRE_DECROISSANT)
    		actualShape = Sorting.sortAireDecroissant(actualShape);  
		else if (orderButtonText == Constant.ORDRE_DISTANCE)
    		actualShape = Sorting.sortDistance(actualShape);  
		else if (orderButtonText == Constant.ORDRE_CARRE_LIGNE)
    		actualShape = Sorting.sortCarreLigne(actualShape);  
		else if (orderButtonText == Constant.ORDRE_LIGNE_CARRE)
    		actualShape = Sorting.sortLigneCarre(actualShape);
	 	
		this.getGraphics().clearRect(0, 0, Constant.WIDTH, Constant.HEIGHT);

		//changer les coordonnée des differentes formes: 0,0 40,40 80,80 ...,... a testerrrrrrrrrrrrrrrrrrrrrrrrr
		while (actualShape != null)
		{			
			actualShape.getForm().setPoint1(new Point(distance,distance));
			actualShape.getForm().draw(this.getGraphics());	
			
			actualShape = actualShape.next();
		    distance += 40;
		}			
		
		actualShape = firstShape;
	}
	
	public void changeOrder(String orderButtonText)
	{
		int distance = 0;
		
		if (actualShape != null)
		{				
			//apelle une des methode de sort, chosit laquelle est fait un if-else
			    	
	    	if (orderButtonText == Constant.ORDRE_ID_CROISSANT)
	    		actualShape = Sorting.sortIdCroissant(actualShape);    		
			else if (orderButtonText == Constant.ORDRE_ID_DECROISSANT)
	    		actualShape = Sorting.sortIdDeroissant(actualShape);  
			else if (orderButtonText == Constant.ORDRE_AIRE_CROISSANT)
	    		actualShape = Sorting.sortAireCroissant(actualShape);  
			else if (orderButtonText == Constant.ORDRE_AIRE_DECROISSANT)
	    		actualShape = Sorting.sortAireDecroissant(actualShape);  
			else if (orderButtonText == Constant.ORDRE_DISTANCE)
	    		actualShape = Sorting.sortDistance(actualShape);  
			else if (orderButtonText == Constant.ORDRE_CARRE_LIGNE)
	    		actualShape = Sorting.sortCarreLigne(actualShape);  
			else if (orderButtonText == Constant.ORDRE_LIGNE_CARRE)
	    		actualShape = Sorting.sortLigneCarre(actualShape);
		 	
			this.getGraphics().clearRect(0, 0, Constant.WIDTH, Constant.HEIGHT);

			//changer les coordonnée des differentes formes: 0,0 40,40 80,80 ...,... a testerrrrrrrrrrrrrrrrrrrrrrrrr
			while (actualShape != null)
			{			
				actualShape.getForm().setPoint1(new Point(distance,distance));
				actualShape.getForm().draw(this.getGraphics());	
				
				actualShape = actualShape.next();
			    distance += 40;
			}	
			
			actualShape = firstShape;
		}
	}
}